﻿namespace Blip.API
{
    using System;
    using System.Collections.Generic;

    /// <summary>
    /// Interfejs dla klas wysyłających żądania HTTP do serwisu Blip.
    /// </summary>
    public interface IBlipCaller
    {
        /// <summary>
        /// Metoda wykonująca żądania HTTP GET do serwisu Blip.
        /// </summary>
        /// <param name="callback">Delegat wywoływany po otrzymaniu odpowiedzi</param>
        /// <param name="url">Adres żądania</param>
        /// <param name="credentials">Obiekt przechowujący informacje dotyczące uwierzytelnienia</param>
        /// <returns>Prawda, gdy żądanie zostało wysłane do serwisu Blip</returns>
        /// <seealso cref="BlipResponse"/>
        /// <seealso cref="IAuthInfo"/>
        bool Get(BlipResponse callback, Uri url, IAuthInfo credentials);

        /// <summary>
        /// Metoda wykonująca żądania HTTP POST do serwisu Blip.
        /// </summary>
        /// <param name="callback">Delegat wywoływany po otrzymaniu odpowiedzi</param>
        /// <param name="url">Adres żądania</param>
        /// <param name="credentials">Obiekt przechowujący informacje dotyczące uwierzytelnienia</param>
        /// <param name="data">Słownik par (klucz, wartość) danych przesyłanych w żądaniu</param>
        /// <returns>Prawda, gdy żądanie zostało wysłane do serwisu Blip</returns>
        /// <seealso cref="BlipResponse"/>
        /// <seealso cref="IAuthInfo"/>
        bool Post(BlipResponse callback, Uri url, IAuthInfo credentials, IDictionary<string, string> data);

        /// <summary>
        /// Metoda wykonująca żądania HTTP PUT do serwisu Blip.
        /// </summary>
        /// <param name="callback">Delegat wywoływany po otrzymaniu odpowiedzi</param>
        /// <param name="url">Adres żądania</param>
        /// <param name="credentials">Obiekt przechowujący informacje dotyczące uwierzytelnienia</param>
        /// <param name="data">Słownik par (klucz, wartość) danych przesyłanych w żądaniu</param>
        /// <returns>Prawda, gdy żądanie zostało wysłane do serwisu Blip</returns>
        /// <seealso cref="BlipResponse"/>
        /// <seealso cref="IAuthInfo"/>
        bool Put(BlipResponse callback, Uri url, IAuthInfo credentials, IDictionary<string, string> data);

        /// <summary>
        /// Metoda wykonująca żądania HTTP DELETE do serwisu Blip.
        /// </summary>
        /// <param name="callback">Delegat wywoływany po otrzymaniu odpowiedzi</param>
        /// <param name="url">Adres żądania</param>
        /// <param name="credentials">Obiekt przechowujący informacje dotyczące uwierzytelnienia</param>
        /// <returns>Prawda, gdy żądanie zostało wysłane do serwisu Blip</returns>
        /// <seealso cref="BlipResponse"/>
        /// <seealso cref="IAuthInfo"/>
        bool Delete(BlipResponse callback, Uri url, IAuthInfo credentials);

        /// <summary>
        /// Metoda wykonująca żądania HTTP POST do serwisu Blip i dołączająca plik.
        /// </summary>
        /// <param name="callback">Delegat wywoływany po otrzymaniu odpowiedzi</param>
        /// <param name="url">Adres żądania</param>
        /// <param name="credentials">Obiekt przechowujący informacje dotyczące uwierzytelnienia</param>
        /// <param name="upload">Nazwa parametru i jej wartość, powiązana z przesyłanym zasobem</param>
        /// <param name="file">Adres pliku do wysłania</param>
        /// <param name="data">Słownik par (klucz, wartość) danych przesyłanych w żądaniu</param>
        /// <param name="progress">Delegat otrzymujący stan postępu wysyłania pliku</param>
        /// <returns>Prawda, gdy żądanie zostało wysłane do serwisu Blip</returns>
        /// <seealso cref="BlipResponse"/>
        /// <seealso cref="IAuthInfo"/>
        /// <seealso cref="UploadProgress"/>
        bool Upload(BlipResponse callback, Uri url, IAuthInfo credentials, KeyValuePair<string, string> upload, Uri file, IDictionary<string, string> data = null, UploadProgress progress = null);
    }
}